#!/usr/bin/python3
# -*- coding:UTF-8 -*-

from typing import List
from typing import TYPE_CHECKING

class Student:
    # 类成员变量类型注解（由于是类变量，此处不使用TypeHinting，但可以通过注释说明）
    school_name: str = "阿里云大学"  # 类变量通常不在实例方法中使用，故不加类型注解

    def __init__(self, name: str, age: int) -> None:
        # 实例变量类型注解
        self.name: str = name
        self.age = age  # 实例变量类型已在setter中定义

    # Getter方法，返回值类型注解
    @property
    def age(self) -> int:
        return self._age

    # Setter方法，参数类型注解
    @age.setter
    def age(self, value: int) -> None:
        if not isinstance(value, int):
            raise ValueError("年龄必须是整数")
        if value < 0 or value > 150:
            raise ValueError("年龄超出合理范围")
        self._age = value

    # 自定义字符串表示形式，返回值类型注解
    def __str__(self) -> str:
        return f"学生姓名：{self.name}, 年龄：{self.age}, 学校：{Student.school_name}"

    def __repr__(self) -> str:
        return self.__str__()

if __name__ == "__main__":
    print(Student.school_name)
    # 使用示例
    student1 = Student("张三", 20)
    print(student1)  # 调用自定义的str方法输出学生信息

    try:
        student1.age = -1  # 尝试设置不合理年龄，会抛出异常
    except ValueError as e:
        print(e)

    student1.age = 22  # 正确设置年龄
    print(student1)